home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / dll / taskbar.c < prev    next >
C/C++ Source or Header  |  2004-01-11  |  11KB  |  390 lines

  1. /*-------------------------------------------------------------
  2.   taskbar.c : customize taskbar
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcdll.h"
  10. #include "newapi.h"
  11.  
  12. /* Globals */
  13. void RefreshTaskbar(HWND hwndClock);
  14. void InitTaskbar(HWND hwndClock);
  15. void EndTaskbar(HWND hwndClock);
  16. LRESULT CallOldTaskbarWndProc(HWND hwnd, UINT message,
  17.     WPARAM wParam, LPARAM lParam);
  18.  
  19. /* Statics */
  20. static void SubclassTaskbar(HWND hwndTaskbar);
  21. static void UnSubclassTaskbar(HWND hwndTaskbar);
  22. static LRESULT CALLBACK WndProcTaskBar(HWND, UINT, WPARAM, LPARAM);
  23. static void SetRebarGrippers(HWND hwndRebar);
  24. static void EndRebarGrippers(HWND hwndRebar);
  25. static void SetFlatTray(HWND hwndTray);
  26. static void EndFlatTray(HWND hwndTray);
  27. static void SetFlatTaskbar(HWND hwndTaskbar);
  28. static void EndFlatTaskbar(HWND hwndTaskbar);
  29. static void SetLayeredTaskbar(HWND hwndTaskbar);
  30. static void EndLayeredTaskbar(HWND hwndTaskbar);
  31. static void RefreshRebar(HWND hwndRebar);
  32.  
  33. static WNDPROC m_oldWndProcTaskBar = NULL;
  34. static BOOL m_bHiddenGrippers = FALSE;
  35. static BOOL m_bFlatTaskbar = FALSE;
  36. static BOOL m_bFlatTray = FALSE;
  37. static BOOL m_bLayeredTaskbar = FALSE;
  38.  
  39. /*--------------------------------------------------
  40.   various customization of task bar
  41. ----------------------------------------------------*/
  42. void InitTaskbar(HWND hwndClock)
  43. {
  44.     HWND hwndTaskbar, hwndRebar, hwndTray;
  45.     
  46.     hwndTray = GetParent(hwndClock);
  47.     hwndTaskbar = GetParent(hwndTray);
  48.     hwndRebar = FindWindowEx(hwndTaskbar, NULL, "ReBarWindow32", NULL);
  49.     
  50.     SubclassTaskbar(hwndTaskbar);
  51.     
  52.     SetFlatTray(hwndTray);       // flat tray
  53.     
  54.     SetRebarGrippers(hwndRebar); // hide grippers
  55.     
  56.     SetFlatTaskbar(hwndTaskbar); // flat task bar
  57.     
  58.     SetLayeredTaskbar(hwndTaskbar); // transparent task bar
  59. }
  60.  
  61. /*--------------------------------------------------
  62.   restore customization
  63. ----------------------------------------------------*/
  64. void EndTaskbar(HWND hwndClock)
  65. {
  66.     HWND hwndTaskbar, hwndRebar, hwndTray;
  67.     
  68.     hwndTray = GetParent(hwndClock);
  69.     hwndTaskbar = GetParent(hwndTray);
  70.     hwndRebar = FindWindowEx(hwndTaskbar, NULL, "ReBarWindow32", NULL);
  71.     
  72.     UnSubclassTaskbar(hwndTaskbar);
  73.     
  74.     EndLayeredTaskbar(hwndTaskbar);
  75.     
  76.     EndFlatTaskbar(hwndTaskbar);
  77.     
  78.     EndRebarGrippers(hwndRebar);
  79.     
  80.     EndFlatTray(hwndTray);
  81. }
  82.  
  83. /*--------------------------------------------------
  84.   redraw taskbar
  85. ----------------------------------------------------*/
  86. void RefreshTaskbar(HWND hwndClock)
  87. {
  88.     HWND hwndTaskbar, hwndRebar, hwndTray, hwndStartButton;
  89.     
  90.     hwndTray = GetParent(hwndClock);
  91.     hwndTaskbar = GetParent(hwndTray);
  92.     hwndRebar = FindWindowEx(hwndTaskbar, NULL, "ReBarWindow32", NULL);
  93.     hwndStartButton = FindWindowEx(hwndTaskbar, NULL, "Button", NULL);
  94.     
  95.     InvalidateRect(hwndStartButton, NULL, TRUE);
  96.     InvalidateRect(hwndTray, NULL, TRUE);
  97.     PostMessage(hwndTray, WM_SIZE, SIZE_RESTORED, 0);
  98.     
  99.     RefreshRebar(hwndRebar);
  100.     PostMessage(hwndRebar, WM_SIZE, SIZE_RESTORED, 0);
  101.     
  102.     InvalidateRect(hwndTaskbar, NULL, TRUE);
  103.     PostMessage(hwndTaskbar, WM_SIZE, SIZE_RESTORED, 0);
  104. }
  105.  
  106. /*--------------------------------------------------
  107.   call default window procedure of task bar
  108.   this is called in startmenu.c
  109. ----------------------------------------------------*/
  110. LRESULT CallOldTaskbarWndProc(HWND hwnd, UINT message,
  111.     WPARAM wParam, LPARAM lParam)
  112. {
  113.     if(m_oldWndProcTaskBar)
  114.         return CallWindowProc(m_oldWndProcTaskBar, hwnd,
  115.             message, wParam, lParam);
  116.     return 0;
  117. }
  118.  
  119. /*--------------------------------------------------
  120.   subclassify Task bar
  121. ----------------------------------------------------*/
  122. void SubclassTaskbar(HWND hwndTaskbar)
  123. {
  124.     BOOL bSubclass;
  125.     
  126.     bSubclass = FALSE;
  127.     if(!g_bIE4) bSubclass = TRUE; // old Windows 95
  128.     
  129.     if(bSubclass)
  130.     {
  131.         if(m_oldWndProcTaskBar) return;
  132.         
  133.         if(IsSubclassed(hwndTaskbar)) return;
  134.         
  135.         m_oldWndProcTaskBar = (WNDPROC)GetWindowLong(hwndTaskbar, GWL_WNDPROC);
  136.         SetWindowLong(hwndTaskbar, GWL_WNDPROC, (LONG)WndProcTaskBar);
  137.     }
  138. }
  139.  
  140. /*--------------------------------------------------
  141.   restore window procedure of Task bar
  142. ----------------------------------------------------*/
  143. void UnSubclassTaskbar(HWND hwndTaskbar)
  144. {
  145.     if(hwndTaskbar && IsWindow(hwndTaskbar))
  146.     {
  147.         if (hwndTaskbar)
  148.             SetWindowLong(hwndTaskbar, GWL_WNDPROC,
  149.                 (LONG)m_oldWndProcTaskBar);
  150.     }
  151.     m_oldWndProcTaskBar = NULL;
  152. }
  153.  
  154. /*------------------------------------------------
  155.   window procedure of subclassified task bar
  156. --------------------------------------------------*/
  157. LRESULT CALLBACK WndProcTaskBar(HWND hwnd, UINT message,
  158.     WPARAM wParam, LPARAM lParam)
  159. {
  160.     switch(message)
  161.     {
  162.         // owner-drawn start menu (Win95 without IE 4)
  163.         case WM_DRAWITEM:
  164.             // startmenu.c
  165.             if(OnDrawItemStartMenu(hwnd, (DRAWITEMSTRUCT*)lParam))
  166.                 return 1;
  167.             break;
  168.         case WM_EXITSIZEMOVE:
  169.             PostMessage(hwnd, WM_SIZE, SIZE_RESTORED, 0);
  170.             break;
  171.         
  172.         /*
  173.         case WM_MOUSEWHEEL:
  174.             PostMessage(hwndTClockMain, message, wParam, lParam);
  175.             break;
  176.         */
  177.     }
  178.     return CallWindowProc(m_oldWndProcTaskBar, hwnd, message, wParam, lParam);
  179. }
  180.  
  181. /*--------------------------------------------------
  182.   hide grippers
  183. ----------------------------------------------------*/
  184. void SetRebarGrippers(HWND hwndRebar)
  185. {
  186.     COLORSCHEME colScheme;
  187.     
  188.     if(!hwndRebar || g_bVisualStyle) return;
  189.     
  190.     EndRebarGrippers(hwndRebar);
  191.     
  192.     m_bHiddenGrippers  = GetMyRegLong(NULL, "RebarGripperHide", FALSE);
  193.     
  194.     if(!m_bHiddenGrippers) return;
  195.     
  196.     colScheme.dwSize = sizeof(colScheme);
  197.     colScheme.clrBtnHighlight = GetSysColor(COLOR_3DFACE);
  198.     colScheme.clrBtnShadow = GetSysColor(COLOR_3DFACE);
  199.     
  200.     SendMessage(hwndRebar, RB_SETCOLORSCHEME,
  201.         0, (LPARAM) (LPCOLORSCHEME)&colScheme);
  202. }
  203.  
  204. /*--------------------------------------------------
  205.   restore "hide grippers"
  206. ----------------------------------------------------*/
  207. void EndRebarGrippers(HWND hwndRebar)
  208. {
  209.     COLORSCHEME colScheme2;
  210.     
  211.     if(!m_bHiddenGrippers) return;
  212.     m_bHiddenGrippers = FALSE;
  213.     if(!hwndRebar || g_bVisualStyle) return;
  214.     
  215.     colScheme2.dwSize = sizeof(colScheme2);
  216.     colScheme2.clrBtnHighlight = GetSysColor(COLOR_3DHILIGHT);
  217.     colScheme2.clrBtnShadow = GetSysColor(COLOR_3DSHADOW);
  218.     
  219.     SendMessage(hwndRebar, RB_SETCOLORSCHEME,
  220.         0, (LPARAM) (LPCOLORSCHEME)&colScheme2);
  221. }
  222.  
  223. /*----------------------------------------------------
  224.    flat taskbar
  225. ------------------------------------------------------*/
  226. void SetFlatTaskbar(HWND hwndTaskbar)
  227. {
  228.     STYLESTRUCT ss;
  229.     LONG style;
  230.     BOOL b;
  231.     
  232.     if(!hwndTaskbar || g_bVisualStyle) return;
  233.     
  234.     b = GetMyRegLong(NULL, "TaskBarBorder", FALSE);
  235.     if(!b && m_bFlatTaskbar) EndFlatTaskbar(hwndTaskbar);
  236.     
  237.     m_bFlatTaskbar = b;
  238.     if(!m_bFlatTaskbar) return;
  239.     
  240.     style = GetWindowLong(hwndTaskbar, GWL_STYLE);
  241.     
  242.     ss.styleOld = style;
  243.     ss.styleNew = style & ~(WS_THICKFRAME|WS_BORDER);
  244.     
  245.     SetWindowLong(hwndTaskbar, GWL_STYLE, ss.styleNew);
  246.     
  247.     SendMessage(hwndTaskbar, WM_STYLECHANGED,
  248.         GWL_STYLE|GWL_EXSTYLE, (LPARAM)&ss);
  249.     SendMessage(hwndTaskbar, WM_SYSCOLORCHANGE, 0, 0);
  250.     
  251.     SetWindowPos(hwndTaskbar, NULL, 0, 0, 0, 0,
  252.         SWP_DRAWFRAME | SWP_FRAMECHANGED | 
  253.         SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
  254. }
  255.  
  256. /*--------------------------------------------------
  257.   restore "flat taskbar"
  258. ----------------------------------------------------*/
  259. void EndFlatTaskbar(HWND hwndTaskbar)
  260. {
  261.     STYLESTRUCT ss;
  262.     LONG style;
  263.     
  264.     if(!hwndTaskbar || g_bVisualStyle) return;
  265.     
  266.     style = GetWindowLong(hwndTaskbar, GWL_STYLE);
  267.     
  268.     ss.styleOld = style;
  269.     ss.styleNew = style | (WS_THICKFRAME|WS_BORDER);
  270.     
  271.     SetWindowLong(hwndTaskbar, GWL_STYLE, ss.styleNew);
  272.     
  273.     SendMessage(hwndTaskbar, WM_STYLECHANGED,
  274.         GWL_STYLE, (LPARAM)&ss);
  275.     SetWindowPos(hwndTaskbar, NULL, 0, 0, 0, 0,
  276.         SWP_DRAWFRAME | SWP_FRAMECHANGED |
  277.         SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
  278. }
  279.  
  280. /*----------------------------------------------------
  281.   flat tray
  282. ------------------------------------------------------*/
  283. void SetFlatTray(HWND hwndTray)
  284. {
  285.     LONG style;
  286.     
  287.     if(!hwndTray || g_bVisualStyle) return;
  288.     
  289.     EndFlatTray(hwndTray);
  290.     
  291.     m_bFlatTray = GetMyRegLong(NULL, "FlatTray", FALSE);
  292.     if(!m_bFlatTray) return;
  293.     
  294.     style = GetWindowLong(hwndTray, GWL_EXSTYLE);
  295.     
  296.     SetWindowLong(hwndTray, GWL_EXSTYLE, style & ~WS_EX_STATICEDGE);
  297.     SetWindowPos(hwndTray, NULL, 0, 0, 0, 0,
  298.         SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
  299. }
  300.  
  301. /*--------------------------------------------------
  302.   restore "flat tray"
  303. ----------------------------------------------------*/
  304. void EndFlatTray(HWND hwndTray)
  305. {
  306.     LONG style;
  307.     
  308.     if(!m_bFlatTray) return;
  309.     m_bFlatTray = FALSE;
  310.     if(!hwndTray || g_bVisualStyle) return;
  311.     
  312.     style = GetWindowLong(hwndTray, GWL_EXSTYLE);
  313.     
  314.     SetWindowLong(hwndTray, GWL_EXSTYLE, style|WS_EX_STATICEDGE);
  315.     SetWindowPos(hwndTray, NULL, 0, 0, 0, 0,
  316.         SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
  317. }
  318.  
  319. /*--------------------------------------------------
  320.   transparent taskbar
  321. ----------------------------------------------------*/
  322. void SetLayeredTaskbar(HWND hwndTaskbar)
  323. {
  324.     LONG exstyle;
  325.     int alpha;
  326.     BOOL b;
  327.     
  328.     if(!(g_winver&WIN2000)) return;
  329.     if(!hwndTaskbar) return;
  330.     
  331.     alpha = GetMyRegLong(NULL, "AlphaTaskbar", 0);
  332.     b = (alpha > 0);
  333.     if(!b && m_bLayeredTaskbar) EndLayeredTaskbar(hwndTaskbar);
  334.     
  335.     m_bLayeredTaskbar = b;
  336.     if(!m_bLayeredTaskbar) return;
  337.     
  338.     alpha = 255 - (alpha * 255 / 100);
  339.     if(alpha < 8) alpha = 8;
  340.     else if(alpha > 255) alpha = 255;
  341.     
  342.     exstyle = GetWindowLong(hwndTaskbar, GWL_EXSTYLE);
  343.     if(alpha < 255) exstyle |= WS_EX_LAYERED;
  344.     else exstyle &= ~WS_EX_LAYERED;
  345.     SetWindowLong(hwndTaskbar, GWL_EXSTYLE, exstyle);
  346.     
  347.     if(alpha == 0)
  348.         MySetLayeredWindowAttributes(hwndTaskbar,
  349.             GetSysColor(COLOR_3DFACE), 0, LWA_COLORKEY);
  350.     else if(alpha < 255)
  351.         MySetLayeredWindowAttributes(hwndTaskbar, 0, (BYTE)alpha, LWA_ALPHA);
  352. }
  353.  
  354. /*--------------------------------------------------
  355.   restore "transparent taskbar"
  356. ----------------------------------------------------*/
  357. void EndLayeredTaskbar(HWND hwndTaskbar)
  358. {
  359.     LONG exstyle;
  360.     
  361.     if(!(g_winver&WIN2000)) return;
  362.     if(!m_bLayeredTaskbar) return;
  363.     m_bLayeredTaskbar = FALSE;
  364.     if(!hwndTaskbar) return;
  365.     
  366.     exstyle = GetWindowLong(hwndTaskbar, GWL_EXSTYLE);
  367.     if(exstyle & WS_EX_LAYERED)
  368.         SetWindowLong(hwndTaskbar, GWL_EXSTYLE, exstyle&~WS_EX_LAYERED);
  369. }
  370.  
  371. /*--------------------------------------------------
  372.   redraw ReBarWindow32 forcely
  373. ----------------------------------------------------*/
  374. void RefreshRebar(HWND hwndRebar)
  375. {
  376.     if(hwndRebar)
  377.     {
  378.         HWND hwnd;
  379.         
  380.         InvalidateRect(hwndRebar, NULL, TRUE);
  381.         hwnd = GetWindow(hwndRebar, GW_CHILD);
  382.         while(hwnd)
  383.         {
  384.             InvalidateRect(hwnd, NULL, TRUE);
  385.             hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  386.         }
  387.     }
  388. }
  389.  
  390.